package com.mycode.proxy13;

import com.mycode.proxy13.resolve.ProxySearcher;
import com.mycode.proxy13.resolve.RealSearcher;
import com.mycode.proxy13.resolve.Searcher;

/**
 * 代理模式：给某一个对象提供一个代理，并由代理对象控制对原对象的引用，增加客户需要的额外服务
 * 主要优点：
 *     1、代理模式能够协调调用者和被调用者，在一定程度上降低了系统的耦合度
 *     2、客户端可以针对抽象主题角色进行编程，增加和更换代理类无须修改源代码，符合开闭原则
 *     3、远程代理为位于两个不同地主空间对象的访问提供了一种实现体制
 *     4、虚拟代理通过一个消耗资源较少的对象来代表一个消耗资源较多的对象，节省系统运行开销
 *     5、保护代理可以控制对一个对象的访问权限
 *
 * 主要缺点：
 *     1、客户端和真实主题之间增加了代理对象，可能会造成请求处理的速度变慢
 *     2、实现代理模式需要额外的工作，有些代理模式的实现非常复杂
 *
 * 使用场景：
 *     1、客户端对象需要访问远程主机中的对象时，可以使用远程代理
 *     2、当需要用一个消耗资源较少的对象来代理一个消耗资源较多的对象，使用虚拟代理
 *     3、当需要控制对一个对象的访问，使用保护代理
 *     4、需要为某一个被频繁访问的操作结果提供一个临时存储空间，以供多个客户端共享访问时，可以做缓冲代理
 *     5、当需要为一个对象的访问提供一些额外的操作时，可以使用智能引用代理
 */
public class Bootstrap {

    public static void main(String[] args) {
        Searcher searcher = new ProxySearcher();
        String result = searcher.doSearch("zhangsan", "huhuhu");
    }
}
